//
//  OAuthViewControllerTests.swift
//  002-TDD
//
//  Created by 谭淇 on 15/3/2.
//  Copyright (c) 2015年 谭淇. All rights reserved.
//

import UIKit
import XCTest

/*
    所有要测试的函数都是要以test开头

    setUp()
        test1()
        test2()
        test3()
    tearDown()

    在跑测试的时候，可以一次跑所有的test，也可以一次只跑一个
    在实际开发中，
    先写测试 - 运行是红色的 - 红灯
    再写代码 - 运行时绿色的 - 绿灯
    重构 - 红灯、绿灯
    所以，单元测试也叫 红灯绿灯开发

    断言：XCTAssert
    提前预判符合某一种条件！
    - 在单元测试中，如果不符合断言条件，就会报错！
    - 在正规的代码中，同样可以使用断言!
    - 在测试的时候，如果不符合条件，运行时会直接崩溃!
    - 在发布的时候，如果不符合条件，但是代码本身能够运行，还是会继续执行下去。断言不会对程序的运行造成任何影响！
    - OC中断言用得少？因为OC是消息机制，可以给nil发送消息，也不会报错！
    - 提示：在今后的开发中，可以大胆使用断言
    - 发布的时候，断言被忽略，相当于保护锁

    程序员还是希望在开发的时候看到崩溃，还是发布之后在用户那里崩溃？
    不要拿你的用户当测试人员
    测试时候，如果发现条件不满足，能够提示程序员及时作出调整！
    有利于提前检测代码逻辑是否合理
    release模式(发布模式)，assert会自动忽略
    assert几乎是所有C/C++程序员的最爱！直接体现开发经验
*/

class OAuthViewControllerTests: XCTestCase {
    
    // 在运行之前，运行一次，可以做全局的初始化
    override func setUp() {
        super.setUp()
        // Put setup code here. This method is called before the invocation of each test method in the class.
    }
    // 在运行结束之前，运行一次，可以做销毁操作
    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }

    // MARK: 测试处理的URL
    // 测试函数名：test + 要测试的函数名
    // 测试用例：测试使用的例子
    func testLoadWithCode() {
        // 1.登陆界面URL
        var url = NSURL(string: "https://api.weibo.com/oauth2/authorize?client_id=1562433295&redirect_uri=http://m.baidu.com")
        var result = OAuthVC!.loadWithCode(url!)
        XCTAssertTrue(result.isLoad, "页面应该被加载")
        XCTAssertNil(result.code, "code应该为nil")
        
        // 2.点击注册
        url = NSURL(string: "http://weibo.cn/dpool/ttt/h5/reg.php?wm=4406&appsrc=2wad0H&backURL=https%3A%2F%2Fapi.weibo.com%2F2%2Foauth2%2Fauthorize%3Fclient_id%3D1562433295%26response_type%3Dcode%26display%3Dmobile%26redirect_uri%3Dhttp%253A%252F%252Fm.baidu.com%26from%3D%26with_cookie%3D")
        result = OAuthVC!.loadWithCode(url!)
        XCTAssertFalse(result.isLoad, "页面不应该被加载")
        XCTAssertNil(result.code, "code应该为nil")
        
        // 3.请求授权
        url = NSURL(string: "https://api.weibo.com/oauth2/authorize")
        result = OAuthVC!.loadWithCode(url!)
        XCTAssertTrue(result.isLoad, "页面应该被加载")
        XCTAssertNil(result.code, "code应该为nil")
        
        // 4.授权成功回调回调地址
        let demoCode = "e47ab32450008f2d0b874ff953c0d223\(arc4random_uniform(10))"
        println(demoCode)
        url = NSURL(string: "http://m.baidu.com/?code=\(demoCode)")
        result = OAuthVC!.loadWithCode(url!)
        XCTAssertFalse(result.isLoad, "页面不应该被加载")
        XCTAssert(result.code == demoCode, "code不应该为nil")
        
        // 5.取消按钮
        url = NSURL(string: "http://m.baidu.com/?error_uri=%2Foauth2%2Fauthorize&error=access_denied&error_description=user%20denied%20your%20request.&error_code=21330")
        result = OAuthVC!.loadWithCode(url!)
        XCTAssertFalse(result.isLoad, "页面不应该被加载")
        XCTAssertNil(result.code, "code应该为nil")
        
        // 6.换个账号
        url = NSURL(string: "http://login.sina.com.cn/sso/logout.php?entry=openapi&r=https%3A%2F%2Fapi.weibo.com%2Foauth2%2Fauthorize%3Fclient_id%3D1562433295%26redirect_uri%3Dhttp%3A%2F%2Fm.baidu.com")
        result = OAuthVC!.loadWithCode(url!)
        XCTAssertFalse(result.isLoad, "页面不应该被加载")
        XCTAssertNil(result.code, "code应该为nil")
    }
    
    // MARK: 测试界面
    /**
    1.从storyboard加载viewController
    2.根视图是UIWebView - test
    3.webView的代理是视图控制器 - test
    */
    
    // 根视图是 UIWebView
    func testRootView() {
        // 判断根视图是否 UIWebView
        let view = OAuthVC!.view
        XCTAssert(view.isKindOfClass(UIWebView.self), "根视图控制器类型不是UIWebView")
    }
    // webView的代理是视图控制器
    func testRootViewDelegate() {
        // 判断webView的代理是否视图控制器
        let webView = OAuthVC!.view as! UIWebView
        // === 在swift中判断恒等，对象类型一致、指针地址一致
        XCTAssert(webView.delegate === OAuthVC, "webView的代理不是视图控制器")
    }
    
     ///  测试使用的视图控制器
    lazy var OAuthVC: OAuthViewController? = {
        // 加载视图控制器
        // mainBundle 是主程序的包路径，测试的时候不能使用
        let bundle = NSBundle(forClass: OAuthViewControllerTests.self)
        println(bundle)
        let sb = UIStoryboard(name: "OAuth", bundle: bundle)
        return sb.instantiateInitialViewController() as? OAuthViewController
    }()
}
